package com.cj.mobile.iabp.app.global;

import android.content.Context;
import android.text.TextUtils;
import android.util.Base64;

import com.cj.mobile.iabp.BuildConfig;
import com.cj.mobile.iabp.app.utils.AppPreferencesHelper;
import com.cj.mobile.iabp.mvp.model.entity.LoginResponse;
import com.tencent.bugly.crashreport.CrashReport;

import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;

import javax.inject.Inject;
import javax.inject.Singleton;

import timber.log.Timber;

/**
 * @ Title: AccountManager
 * @ Package com.zqw.mobile.recycling.api
 * @ Description: 用户信息存取类：从SharedPreferences中读取用户登录信息
 * @ author: wly
 * @ date: 2017/03/13 14:24
 */
@Singleton
public final class AccountManager {

    /*----------------------------------------------业务常量-------------------------------------------------*/
    /**
     * 头像
     */
    private final String PHOTOURL = "photoUrl";

    /**
     * 账号
     */
    private final String ACCOUNT = "Account";

    /**
     * 密码
     */
    private final String PASSWORD = "Password";

    /**
     * Token
     */
    private final String TOKEN = "Token";

    /**
     * 用户id
     */
    private final String USERID = "Userid";

    /**
     * 用户名称(昵称)
     */
    private final String USER_NAME = "UserName";

    /**
     * 电话
     */
    private final String RECYCLE_PHONE = "recyclePhone";
    /**
     * 科室
     */
    private final String DEPT_NAME = "deptName";
    /**
     * 权限
     */
    private final String OPT_PERMISSIONS = "optPermissions";
    /**
     * 用户性别
     */
    private final String USER_SEX = "userSex";


    /**
     * APP启动次数(达到一定次数后清理日志)
     */
    private final String START_TIME = "startTime";


    /**
     * 定位 - 经度
     */
    private static final String LONGITUDE = "Longitude";

    /**
     * 定位 - 纬度
     */
    private static final String LATITUDE = "latitude";

    /**
     * 定位 - 半径
     */
    private static final String RADIUS = "radius";

    /**
     * 定位 - 地址
     */
    private static final String ADDRESS = "address";

    /**
     * 省
     */
    private static final String PROVINCE = "province";

    /**
     * 市
     */
    private static final String CITY = "city";

    /**
     * 区
     */
    private static final String DISTRICT = "district";

    /**
     * 是否同意隐私政策
     */
    private static final String PRIVACY_POLICY = "privacyPolicy";

    // URL服务器地址
    private static final String URL = "url";

    // 定位权限
    private static final String IS_ASK_PERMISSION = "isShowLocationPermissions";

    // 切换账号
    private static final String SWITCH_ACCOUNT = "switchAccounts";
    // 历史搜索记录
    private static final String HISTORICAL_SEARCH = "historicalSearch";

    // 登录方式
    private static final String LOGIN_METHOD = "loginMethod";
    /*----------------------------------------------操作对象-------------------------------------------------*/

    private AppPreferencesHelper spHelper;

    @Inject
    public AccountManager(Context context) {
        this.spHelper = new AppPreferencesHelper(context.getApplicationContext(), BuildConfig.SHARED_NAME_INVEST, 1);

        updateBugly();
    }

    /**
     * 获取服务器地址
     */
    public String getServiceUrl() {
        return spHelper.getPref(URL, "");
    }

    /**
     * 设置服务器地址
     */
    public void setServiceUrl(String url) {
        spHelper.put(URL, url);
    }


    /**
     * 更新Bugly状态
     */
    private void updateBugly() {
        try {
            String userId = getUserid();
            if (!isLogin()) userId = "Not Login";
            CrashReport.setUserId(userId);// 记录当前是谁上报的
        } catch (Exception ignored) {
        }
    }

    /**
     * 保存登录信息(登录成功后调用此方法)
     *
     * @param account       账号
     * @param password      密码
     * @param loginResponse 用户信息
     */
    public void saveAccountInfo(String account, String password, LoginResponse loginResponse) {
        spHelper.put(ACCOUNT, account);
        spHelper.put(PASSWORD, password);
        updateAccountInfo(loginResponse);
    }

    /**
     * 更新登录信息(登录成功后调用此方法)
     *
     * @param loginResponse 用户信息
     */
    public void updateAccountInfo(LoginResponse loginResponse) {
        spHelper.put(TOKEN, md5(loginResponse));
        spHelper.put(USERID, loginResponse.getAccount().getId());
        spHelper.put(USER_NAME, loginResponse.getAccount().getName());
        spHelper.put(PHOTOURL, "");
        spHelper.put(RECYCLE_PHONE, loginResponse.getAccount().getMobile());
        spHelper.put(DEPT_NAME, loginResponse.getAccount().getDeptName());
        if (!TextUtils.isEmpty(loginResponse.getAccount().getPc()))
            spHelper.put(OPT_PERMISSIONS, loginResponse.getAccount().getPc());
        spHelper.put(USER_SEX, loginResponse.getAccount().getSex());
        updateBugly();
    }

    public void setUserName(String name) {
        spHelper.put(USER_NAME, name);
    }

    /**
     * Token 加密
     */
    public String md5(LoginResponse info) {
        // 入参组成模式：Uid+ "|" + Token+ "|" + ClientType+ "|" +LastLoginTime
        String clientType = "2";
        String plainText = info.getAccount().getId() + "|" + info.getToken() + "|" + clientType + "|" + info.getLastLoginTime();
        byte[] b = plainText.getBytes(StandardCharsets.UTF_8);
        b = Base64.encode(b, Base64.DEFAULT);
        String s = new String(b);
        s = s.trim();
        s = s.replace("\t", "");
        s = s.replace("\n", "");
        return s;
    }

    /**
     * 清除账号信息(手动点击退出登录后调用此方法)
     */
    public void clearAccountInfo() {
        spHelper.put(ACCOUNT, "");
        spHelper.put(PASSWORD, "");
        spHelper.put(TOKEN, "");
        spHelper.put(USER_NAME, "");
        spHelper.put(USERID, "");
        spHelper.put(PHOTOURL, "");
        spHelper.put(RECYCLE_PHONE, "");
        spHelper.put(DEPT_NAME, "");

        updateBugly();
    }

    /**
     * 设置Token
     *
     * @param token token
     */
    public void setToken(String token) {
        spHelper.put(TOKEN, token);
    }

    /**
     * 获取用户名称(昵称)
     *
     * @return 如果为空则返回账号
     */
    public String getUserName() {
        String username = spHelper.getPref(USER_NAME, "");
        if (TextUtils.isEmpty(username)) {
            username = spHelper.getPref(ACCOUNT, "");
        }
        return username;
    }

    /**
     * 获取账号
     *
     * @return 回调
     */
    public String getAccount() {
        return spHelper.getPref(ACCOUNT, "");
    }

    /**
     * 科室
     */
    public String getDeptName() {
        return spHelper.getPref(DEPT_NAME, "");
    }

    /**
     * 获取操作权限
     */
    public boolean getOptPermissions() {
        String result = spHelper.getPref(OPT_PERMISSIONS, "");

        return result.equals("1");
    }

    /**
     * 获取电话
     */
    public String getCurrPhone() {
        return spHelper.getPref(RECYCLE_PHONE, "");
    }

    /**
     * 获取密码
     *
     * @return 回调
     */
    public String getPassword() {
        return spHelper.getPref(PASSWORD, "");
    }

    /**
     * 获取Token
     *
     * @return 返回数据
     */
    public String getToken() {
        String str = spHelper.getPref(TOKEN, "");
        Timber.i("RetrofitFactoty：Token=%s", str);
        return str;
    }

    /**
     * 获取头像URL
     *
     * @return 返回数据
     */
    public String getPhotoUrl() {
        return spHelper.getPref(PHOTOURL, "");
    }

    /**
     * 更新头像URL
     */
    public void setPhotoUrl(String url) {
        spHelper.put(PHOTOURL, url);
    }


    /**
     * 更新定位信息(经纬度)
     *
     * @param latitude  纬度
     * @param longitude 经度
     * @param radius    半径
     * @param address   详细地址
     */
    public void updateLocation(double latitude, double longitude, float radius, String province, String city, String district, String address) {
        spHelper.put(LATITUDE, String.valueOf(latitude));
        spHelper.put(LONGITUDE, String.valueOf(longitude));
        spHelper.put(RADIUS, radius);

        if (!TextUtils.isEmpty(province)) spHelper.put(PROVINCE, province);
        if (!TextUtils.isEmpty(city)) spHelper.put(CITY, city);
        if (!TextUtils.isEmpty(district)) spHelper.put(DISTRICT, district);

        if (!TextUtils.isEmpty(address)) spHelper.put(ADDRESS, address);
    }

    /**
     * 获得省份
     */
    public String getProvince() {
        return spHelper.getPref(PROVINCE, "");
    }

    /**
     * 获得城市
     */
    public String getCity() {
        return spHelper.getPref(CITY, "");
    }

    /**
     * 获得区域
     */
    public String getDistrict() {
        return spHelper.getPref(DISTRICT, "");
    }

    /**
     * 获取用户id
     *
     * @return 返回数据
     */
    public String getUserid() {
        return spHelper.getPref(USERID, "");
    }


    /**
     * 当前是否登录
     *
     * @return token存在则表示已登录(返回true)否则未登录(返回false)
     */
    public boolean isLogin() {
        String token = spHelper.getPref(TOKEN, "");
        return !TextUtils.isEmpty(token);
    }

    /**
     * 获取经度
     *
     * @return 回调
     */
    public double getLongitude() {
        return Double.parseDouble(spHelper.getPref(LONGITUDE, ""));
    }

    /**
     * 获取纬度
     *
     * @return 回调
     */
    public double getLatitude() {
        return Double.parseDouble(spHelper.getPref(LATITUDE, ""));
    }

    /**
     * 获取半径
     *
     * @return 回调
     */
    public float getRadius() {
        return spHelper.getPref(RADIUS, 0);
    }

    /**
     * 获取定位地址
     *
     * @return 回调
     */
    public String getAddress() {
        return spHelper.getPref(ADDRESS, "");
    }

    /**
     * 获取当前是否同意隐私政策
     */
    public boolean getPrivacyPolicy() {
        return spHelper.getPref(PRIVACY_POLICY, false);
    }

    /**
     * 设置隐私政策
     */
    public void setPrivacyPolicy(boolean isValue) {
        spHelper.put(PRIVACY_POLICY, isValue);
    }

    /**
     * 是否可以询问权限
     */
    public boolean isAskPermission() {
        // 如果等于0代表未获得权限，还可以继续申请。如果是1代表系统判定不能询问权限
        return spHelper.getPref(IS_ASK_PERMISSION, 0) == 0;
    }

    public void setIsAskPermission() {
        spHelper.put(IS_ASK_PERMISSION, 1);
    }

    /**
     * 是否切换账号
     */
    public boolean getIsSwitchAccount() {
        return spHelper.getPref(SWITCH_ACCOUNT, 0) == 1;
    }

    /**
     * 设置切换账号
     */
    public void setIsSwitchAccount(boolean isSwitchAccount) {
        spHelper.put(SWITCH_ACCOUNT, isSwitchAccount ? 1 : 0);
    }

    /**
     * 设置历史搜索记录
     */
    public void setHistorySearch(String value) {
        String str = getHistorySearch();
        if (str.isEmpty()) {
            spHelper.put(HISTORICAL_SEARCH, value);
        } else {
            String[] mList = str.split(",");
            // 数组转HashSet，直接调用contains判断（一行代码搞定判断）
            boolean isExist = Arrays.asList(mList).contains(value);
            if (!isExist) {
                spHelper.put(HISTORICAL_SEARCH, value + "," + str);
            }
        }
    }

    /**
     * 获取历史搜索记录
     *
     * @return 字段串格式，例："1,2,3,4"
     */
    public String getHistorySearch() {
        return spHelper.getPref(HISTORICAL_SEARCH, "");
    }

    public String getSex() {
        return spHelper.getPref(USER_SEX, "1");
    }

    /**
     * 获取历史搜索记录
     *
     * @return List格式
     */
    public List<String> getHistorySearchList() {
        String str = getHistorySearch();
        String[] mList = str.split(",");
        return Arrays.asList(mList);
    }

    /**
     * 登录方式
     *
     * @param method 方式：0代表密码登录，1代表短信验证码登录
     */
    public void setLoginMethod(int method) {
        spHelper.put(LOGIN_METHOD, method);
    }

    /**
     * 是否短信登录
     *
     * @return true代表短信登录，false代表密码登录
     */
    public boolean isSMSLogin() {
        return spHelper.getPref(LOGIN_METHOD, 0) == 1;
    }
}
